package pacBioSimple;
//
//
//import java.util.BitSet;
import java.util.List;
import java.util.concurrent.Callable;
////import java.util.logging.Level;
////import java.util.logging.Logger;
//
//import tools.kmer.KmerSet_binary;
//import tools.kmer.kmerFunctions;
//import tools.sequences.sequenceUtils;
//
public class PacBioSeedBridging implements Callable<List<StringBuilder>>{
//	
//	private StringBuilder seed1 = null;
//	private StringBuilder seed2= null;
//	private int distance=0;
	private List<StringBuilder> candidate = null;
//	private PacBioNodeStack<PackBioNode> stack=null;
//	private CodingTable codingTable=null;
//	private KmerSet_binary ks=null;
//	private boolean dir=false; //false ende // true anfang
//	private int id;
//	private int repVal=0;
//	//private Logger log = Logger.getLogger(PacBioKmerAlgoMain.class.getName());
//	
//	public PacBioSeedBridging(StringBuilder seed1, StringBuilder seed2, int distance,CodingTable table, KmerSet_binary ks,boolean dir,int repVal,List<StringBuilder>candidate)
//	{
//		this.seed1 = seed1;
//		this.seed2 = seed2;
//		this.distance=distance+distance*10/100;
//		this.codingTable=table;
//		this.ks=ks;
//		this.candidate=candidate;
//		this.dir=dir;
//		this.repVal=repVal;
//		init();
//	}
//
//	public PacBioSeedBridging(StringBuilder seed1,int distance,CodingTable table, KmerSet_binary ks,boolean dir,int repVal,List<StringBuilder>candidate)
//	{
//		this.seed1=seed1;
//		this.distance=distance+distance*10/100;
//		this.codingTable=table;
//		this.ks=ks;
//		this.candidate=candidate;
//		this.dir=dir;
//		this.repVal=repVal;
//		init();
//	}
//	
//	private void init()
//	{
//		stack = new PacBioNodeStack<PackBioNode>();
//	}
//	
//	private int checkKmerDistribution(String kmer)
//	{
//		//System.out.print(kmer+ " kmer check\n");
//		if(kmer.equals(""))
//		{
//			return 0;
//		}
//		String kmerToUse = kmerFunctions.kmerToUse(kmer);
//		BitSet bS = ks.getUtils().stringToBitSet(kmerToUse);
//		//BitSet bS = ks.getUtils().stringToBitSet(kmerFunctions.kmerToUse(kmer.toString()));
//		if(ks.exists(kmerToUse))
//		{
//			return(ks.getNumber(bS));
//		}
//		else
//		{
//			return 0;
//		}
//		
//	}
//	private void addCandidate(StringBuilder kmer)
//	{
//		if(dir)
//		{
//			this.candidate.add(sequenceUtils.reverseComplement2(kmer));
//		}
//		else
//		{
//			this.candidate.add(kmer);
//		}
//	}
//	private StringBuilder pop2(StringBuilder kmer)
//	{
//		if(!stack.empty() && !stack.peek().getMarked())
//		{
//			addCandidate(kmer);
//		}
//		stack.pop();
//		--id;
//		if(!stack.empty())
//		{
//			stack.peek().setStatus(stack.peek().getStatus()+1);
//			stack.peek().setMarked(true);
//		}
//		
//		return null;
//	}
//	
//	
//	private StringBuilder pop(StringBuilder kmer, boolean mark)
//	{
//		if(!stack.empty() && mark)
//		{
//			addCandidate(new StringBuilder(kmer));
//		}
//		stack.pop();
//		--id;
//		kmer.deleteCharAt(kmer.length()-1);
//		if(!stack.empty())
//		{
//			stack.peek().setStatus(stack.peek().getStatus()+1);
//		}
//		return kmer;
//	}
//		
//	public void run()
//	{
//		id=0;
//		//here we have to fill all the nasty things building up the stack, saving the result
//		//first add the first root node
//		if(stack.empty())
//		{
//			stack.push(new PackBioNode(0,0));
//			++id;
//		}
//
//		StringBuilder kmer=new StringBuilder(this.seed1);	
//		
//		while(!stack.empty())
//		{		
////			log.log(Level.WARNING,"StackDeep: "+stack.getLength() + "StackNode: "+stack.peek().getId()+" "+stack.peek().getStatus() +" Distance "+ distance+"\n");
//			System.out.println("StackDeep: "+stack.getLength() + "StackNode: "+stack.peek().getId()+" "+stack.peek().getStatus() +" Distance "+ distance +"\n");
//			if(stack.peek().getStatus()>=4)
//			{
//				kmer=pop(kmer,false);
//			}
//			else if(stack.getLength() > this.distance)
//			{
//				if(seed2!=null)
//				{
//					kmer=pop(kmer,false);
//				}
//				else
//				{
//					kmer=pop(kmer,true);
//				}	
//			}
//			else if(seed2!=null && kmer.length()>ks.getKmerSize() && kmer.indexOf(seed2.toString())!=-1)
//			{
//				kmer=pop(kmer,true);
//			}
//			else
//			{
//				//check last element
//				//building up the kmer
//				kmer.append(codingTable.getCodingTableEntry(stack.peek().getStatus()));
//				
//				//check Kmer
//				//int a=kmer.length();
//				//int b = ks.getKmerSize();
//				//String test = kmer.substring(kmer.length()-ks.getKmerSize(), kmer.length());
//				int kmerVal = checkKmerDistribution(kmer.substring(kmer.length()-ks.getKmerSize(), kmer.length()));
//				if(kmerVal!=0 && kmerVal < repVal)
//				{
//					stack.push(new PackBioNode(id, stack.getLength()));
//					++id;
//				}
//				else
//				{
//					if(kmerVal >=repVal)
//					{
//						//write log
//					}
//					kmer.deleteCharAt(kmer.length()-1);
//					stack.peek().setStatus(stack.peek().getStatus()+1);
//				}
//			}
//		}
//		if(this.candidate.size()==0)
//		{
//			this.candidate.add(new StringBuilder(""));
//		}
//	}
//	
//	
	public List<StringBuilder> getCandidates()
	{
		return this.candidate;
	}
//
//	@Override
	public List<StringBuilder> call() throws Exception 
	{
//			run();
//			
		return getCandidates();
	}
//	
//	
}
